//
// Created by JYL on 2024-06-21.
//
#include "beep.h"
#include "cmsis_os.h"
/********************************************************************************
 * 本程序只供学习使用，未经作者许可，不得用于其它任何用途
 * ALIENTEK MiniFly_Remotor
 * 蜂鸣器驱动代码
 * 正点原子@ALIENTEK
 * 技术论坛:www.openedv.com
 * 创建日期:2018/6/1
 * 版本：V1.0
 * 版权所有，盗版必究。
 * Copyright(C) 广州市星翼电子科技有限公司 2014-2024
 * All rights reserved
********************************************************************************/

/*蜂鸣器对应报警的延时时间（ms）*/
//TODO 修改蜂鸣器对应任务名称 ：1。出发  2.转弯  3.送药    4.回到终点

//编程思路，两个软件定时器，一个循环功能，一个根据循环次数，决定结束时间

beepSeq_t beepAction[] =
{
    {false, false, 10},
    {false, false, 150},
    {false, false, 500},
    {false, true, 50},
};

#define  ACTION_NUM	(sizeof(beepAction)/sizeof(beepSeq_t))//动作个数

static bool isInit;
static bool beepEnable;
enum beepAction currentRun;
extern osTimerId_t myTimer_beepHandle;

void runBeepAcktion(enum beepAction action)
{
    currentRun = action;
    beepAction[action].isActive = true;
    osTimerStart(myTimer_beepHandle, beepAction[action].waitMS);
    Buzzer(1);
    beepEnable = true;
}

void stopBeepAcktion(enum beepAction action)
{
    //TODO 测试，如果两个蜂鸣器任务，没有 false 会怎么样
    beepAction[action].isActive = false;
    for(u8 i=0; i<ACTION_NUM; i++){
        if(beepAction[i].isActive == true){
            currentRun = (enum beepAction)i;
            osTimerStart(myTimer_beepHandle, beepAction[currentRun].waitMS);
            return;
        }
    }
    beepEnable = false;
}

void Callback_beep(void *argument)      //runBeepseq
{
    /* USER CODE BEGIN Callback_beep */
    u8 i;
    if(beepAction[currentRun].isLoop == false)beepAction[currentRun].isActive = false;
    for(i=0; i<ACTION_NUM; i++){
        ///从这里可以发现，当多个Action都时true时，软件定时器会执行优先级较高的
        if(beepAction[i].isActive == true){
            osTimerStart(myTimer_beepHandle, beepAction[i].waitMS); //xTimerChangePeriod(, 0);
            break;
        }
    }
    if(i == ACTION_NUM)beepEnable = false;/*当前无动作运行*/
    if(beepEnable)BEEP_TOGGLE();
    else Buzzer(0);
    /* USER CODE END Callback_beep */
}

